package work.base.jvm.summary;



/**
 * JVM内存结构 也叫JVM 运行时数据存储区域 (运行时数据区)
 *
 * 程序计数器 ：当前线程所执行字节码的行号指示器
 * 本地方法栈 ：C++实现的 native关键字修饰的方法
 *
 * Java虚拟机栈
 * Java 方法执行的内存模型
 * 由栈帧组成 每个方法在执行的同时都会创建一个栈帧
 * 每一个方法从调用直至执行完成的过程，就对应着一个栈帧在虚拟机栈中入栈到出栈的过程
 * 栈帧组成
 * 局部变量表        存放方法参数和局部变量
 * 操作数栈          中间变量
 * 动态链接         每个栈帧中包含一个在常量池中对当前方法的引用， 目的是支持方法调用过程的动态连接
 * 方法出口等信息
 *
 * 堆区
 * JDK8之后组成 ：
 * 新生代 (Eden 、From Survivor、To Survivor),老年代
 * Class对象的实例是在堆区
 * 类的成员变量是在堆区的
 *
 * 方法区
 * 堆区和方法区傻傻分不清
 * 更多是逻辑上的一种概念 永久代和元空间是具体实现
 * JVM规范上 存储的是 已被虚拟机加载的类信息(类和方法的元数据 包含版本、方法、字段等)
 *                   常量(final关键字定义常量) 静态变量 JIT编译后的代码缓存等
 * 运行时常量池   class常量池被加载到内存之后的版本 存放class文件的常量池信息(这个class常量池 存放编译期生成的各种字面量和符号引用) 并且把符号引用替换成直接引用
 * JDK1.8之前 Hotspot 中方法区的实现是永久代
 * JDK1.8之后 Hotspot 中方法区的实现是元空间 永久代被移除了 元空间直接在本地内存分配 不是在JVM内存中了
 *                  字符串常量池
 *                  由StringTable类实现 本质是一个HashSet<String> 哈希表
 *                  JDK1.7之前 字符串常量池(字符串常量对象)是存在永久代的 包含在运行时常量池中
 *                  JDK1.7之后 字符串常量池(可以存储String对象的引用)移至堆区 是单独的区域 脱离出运行时常量池
 *                  JDK1.7之后 静态变量转移到堆上了
 *                  运行时常量池和class文件信息(也叫类的元数据 包含了class常量池) 还在方法区 也就是元空间
 * PS：之后是包含当前版本的
 *
 */
public class JvmSummary02 {

    public static void main(String[] args) {

    }


}
